package requests

import (
	"mime/multipart"

	"github.com/gin-gonic/gin"
	"github.com/thedevsaddam/govalidator"

	"github.com/runningwater/gohub/app/requests/validators"
	"github.com/runningwater/gohub/pkg/auth"
)

type UserUpdateProfileRequest struct {
	Name         string `valid:"name" json:"name"`
	City         string `valid:"city" json:"city"`
	Introduction string `valid:"introduction" json:"introduction"`
}

func UserUpdateProfile(data any, c *gin.Context) map[string][]string {
	// 查询用户名重复时，过滤当前用户ID
	uid := auth.CurrentUID(c)
	rules := govalidator.MapData{
		"name":         []string{"required", "alpha_num", "between:3,20", "not_exists:users,name," + uid},
		"city":         []string{"min_cn:2", "max_cn:20"},
		"introduction": []string{"min_cn:4", "max_cn:240"},
	}
	messages := govalidator.MapData{
		"name": []string{
			"required:用户名不能为空",
			"alpha_num:用户名格式错误",
			"between:3,20:用户名长度需在 3-20 之间",
			"not_exists:用户名已存在",
		},
		"city": []string{
			"min_cn:城市长度需至少 2 个字符",
			"max_cn:城市长度不能超过 20 个字符",
		},
		"introduction": []string{
			"min_cn:简介长度需至少 4 个字符",
			"max_cn:简介长度不能超过 240 个字符",
		},
	}
	return validate(data, rules, messages)
}

type UserUpdateEmailRequest struct {
	Email      string `valid:"email" json:"email"`
	VerifyCode string `valid:"verify_code" json:"verify_code,omitempty"`
}

// UserUpdateEmail 处理用户邮箱更新请求
// 参数：
//
//	data - 请求数据，应为 UserUpdateEmailRequest 类型
//	c - Gin 上下文对象
//
// 返回值：
//
//	map[string][]string - 包含验证错误的映射
func UserUpdateEmail(data any, c *gin.Context) map[string][]string {
	currentUser := auth.CurrentUser(c)
	rules := govalidator.MapData{
		"email": []string{
			"required",
			"min:4",
			"max:30",
			"email",
			"not_exists:users,email," + currentUser.GetStringID(),
			"not_in:" + currentUser.Email,
		},
		"verify_code": []string{"required", "digits:6"},
	}
	messages := govalidator.MapData{
		"email": []string{
			"required:邮箱不能为空",
			"min:邮箱长度需至少 4 个字符",
			"max:邮箱长度不能超过 30 个字符",
			"email:邮箱格式错误",
			"not_exists:邮箱已存在",
			"not_in:新邮箱与当前邮箱相同",
		},
		"verify_code": []string{
			"required:验证码不能为空",
			"digits:6:验证码长度必须为 6 位数字",
		},
	}
	errs := validate(data, rules, messages)
	_data := data.(*UserUpdateEmailRequest)
	errs = validators.ValidateVerifyCode(_data.Email, _data.VerifyCode, errs)

	return errs
}

type UserUpdateAvatarRequest struct {
	Avatar *multipart.FileHeader `valid:"avatar" form:"avatar"`
}

func UserUpdateAvatar(data any, c *gin.Context) map[string][]string {
	// size 的单位为 bytes
	// - 1024 bytes 为 1 KB
	// - 1024 * 1024 bytes 为 1 MB
	// - 1024 * 1024 * 1024 bytes 为 1 GB
	// - 20971520 bytes 为 20 MB
	rules := govalidator.MapData{
		"file:avatar": []string{"ext:png,jpg,jpeg", "size:20971520", "required"},
	}
	messages := govalidator.MapData{
		"file:avatar": []string{
			"ext:头像格式错误,只能为 png,jpg,jpeg 一种",
			"siz:头像大小不能超过 20 MB",
			"required:头像不能为空",
		},
	}
	return validateFile(c, data, rules, messages)
}
